FireLens から New Relic Logs へ New Relic 謹製 Fluent Bit イメージを利用してログを保存してみた
AWS Fargate で稼働しているWebアプリケーションのログを FireLens(Fluent Bit)でログルーティングして New Relic Logs へログの保存を試してみます。
New Relic 謹製の Fluent Bit イメージと、一般的に利用されている AWS for Fluent Bitイメージとの設定の違いに焦点をあてて確認します。
以下のドキュメントを参考に設定します。本検証では New Relic の USアカウントを使用しています。EUアカウントの場合は設定方法に違いがあるためドキュメントを確認してください。
New Relic ライセンスキー発行
FireLens(Fluent Bit)から New Relic へデータ送信にあたり New Relic の認証情報が必要になります。ライセンスキーはデータの取り込みができるようになるため安全に管理してください。
API Keys をクリック。
Create a key をクリック。
ライセンスキーを作成します。
ライセンスキーが発行されました。
Copy keyで取得できるキー情報(40字の16進文字列)が後で必要な値となります。※AWS CLIの引数で使います。
Secrets Manager に登録
ライセンスキーを安全に取り扱うためにSecrets Mangerの利用が推奨されています。FireLens(Fluent Bit)内でライセンスキーが必要なため、FireLensはSecrets Mangerを参照してもらいます。
AWS CLIで--secret-string
の引数にCopy keyで取得した40字の16進数文字列を指定します。
aws secretsmanager create-secret --name newrelic-license-key \ --description "Logging test applications with FireLens" \ --secret-string [Copyed License Key Value]
実行結果のARNは後で必要な値となります。 ※タスク定義で使います。
{ "ARN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:newrelic-license-key-Io2JZb", "Name": "newrelic-license-key", "VersionId": "e255140f-0b20-4c3b-b97f-02a3bc4d1780" }
タスク定義編集
一般的に利用されている AWS for Fluent Bit イメージを利用するときとの設定の違いを確認したいため以下で紹介している環境を利用します。Fargate構築用CloudFormationテンプレートも公開していますのでタスクロールの権限など詳細は必要に応じてご確認ください。
コンテナイメージ
AWS for Fluent Bit
AWS for Fluent Bit イメージではカスタムログルーティング用の設定ファイルを同梱したイメージを作成しECRへアップしてあります。また、設定ファイルを読み込むためにoptions
でパスを指定しています。
"essential": true, "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/sample5-dev-custom-logrouter-firelens:v4", "firelensConfiguration": { "type": "fluentbit", "options": { "config-file-type": "file", "config-file-value": "/fluent-bit/etc/extra.conf" } },
New Relic 謹製 Fluent Bit
Fluent Bit のイメージは New Rlic がECRで公開しているイメージを使用します。各リージョン毎にイメージファイルが用意されています。
options
ではECSメタデータの使用を明示的にtrueにしています。明示的にfalseにしない限りは未指定で差し支えないはずですがドキュメントに従います。
"essential": true, "image": "533243300146.dkr.ecr.ap-northeast-1.amazonaws.com/newrelic/logging-firelens-fluentbit", "startTimeout": null, "firelensConfiguration": { "type": "fluentbit", "options": { "enable-ecs-log-metadata": "true" } },
ライセンスキーをSecrets Mangerから取得
AWS for Fluent Bit
Secrets Managerをとくに利用していなかったため未設定です。
"logConfiguration": { "logDriver": "awsfirelens", "secretOptions": null, "options": null },
New Relic 謹製 Fluent Bit
valueFrom
で指定するARN
は AWS CLIでSecrets Managerにライセンスキーを登録したときの実行結果で確認した値です。
"logConfiguration": { "logDriver": "awsfirelens", "secretOptions": [ { "name": "apiKey", "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:newrelic-license-key-Io2JZb" } ], "options": { "Name": "newrelic" } },
マネコンからタスク定義を確認するとこんな状態です。
タスク実行ロールの権限について
ドキュメント通りに進めて見落としそうなポイントはタスク実行ロールにSecrets Managerの権限が必要になります。Fargateの設定を見直してみてください。
検証環境を構築したCloudFormationテンプレートではResource
絞らずにSecrets Mangerへの許可を与えています。実際に利用するときは必要なシークレットのみに限定するのが適切です。
# Allowed Secrets Manager for Task Execute Role GetValueSecretsManagerPolicy: Type: "AWS::IAM::ManagedPolicy" Properties: ManagedPolicyName: !Sub "${ProjectName}-${Environment}-GetValueSecretsManagerPolicy" Path: "/" PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - secretsmanager:GetSecretValue - kms:Decrypt Resource: "*" # Change Required !!!
FireLensの設定は以上です。すべてのログをNew Relicへ送信するだけならNew Relic 謹製 Fluent Bit を起動させるだけに近いです。
タスク起動
New Relic 謹製 Fluent Bit イメージに差し替えたタスク定義からタスクをデプロイしました。
問題なくlog_router
が起動してきました。
log_router
コンテナ自信のログはawslogsドライバー経由でCloudWatch Logsへ保存しています。ログを確認したところエラーは見受けられません。
----------------------------------------------------------------------------------------------------------------------------- | timestamp | message | |---------------|-----------------------------------------------------------------------------------------------------------| | 1640827010651 | [1mFluent Bit v1.8.1[0m | | 1640827010651 | * [1m[93mCopyright (C) 2019-2021 The Fluent Bit Authors[0m | | 1640827010651 | * [1m[93mCopyright (C) 2015-2018 Treasure Data[0m | | 1640827010651 | * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd | | 1640827010651 | * https://fluentbit.io | | 1640827010651 | [2021/12/30 01:16:50] [ info] [engine] started (pid=1) | | 1640827010653 | [2021/12/30 01:16:50] [ info] [storage] version=1.1.1, initializing... | | 1640827010653 | [2021/12/30 01:16:50] [ info] [storage] in-memory | | 1640827010653 | [2021/12/30 01:16:50] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128 | | 1640827010653 | [2021/12/30 01:16:50] [ info] [cmetrics] version=0.1.1 | | 1640827010653 | [2021/12/30 01:16:50] [ info] [input:tcp:tcp.0] listening on 127.0.0.1:8877 | | 1640827010653 | [2021/12/30 01:16:50] [ info] [input:forward:forward.1] listening on unix:///var/run/fluent.sock | | 1640827010653 | [2021/12/30 01:16:50] [ info] [input:forward:forward.2] listening on 127.0.0.1:24224 | | 1640827010754 | [2021/12/30 01:16:50] [ info] [sp] stream processor started | -----------------------------------------------------------------------------------------------------------------------------
Fluent Bit のバージョンが v1.8.1 ということで最新の Fluent Bit のバージョン追従するポリシーではないことが伺えます。 AWS for Fluent Bit はオリジナルの Fluent Bit の更新に比較的早く追従している印象があります。
New Relic Logs を確認
初回の読み込みだけ時間がかかりましたが、以降はリアルタイム近い感覚でログを確認できます。
ELBのヘルスチェックが圧倒的に多いです。ちらほら外部からアクセスを確認できます。
特定のコンテナIDからのログのみの絞り込みはWeb UIからできます。
error
のキーワード検索してみました。ログ検索も機能しています。
New Relic 謹製 Fluent Bit を利用すると簡単にアプリケーションコンテナのログを New Relic へ送信、保存できることが確認できました。
おわりに
New Relic へすべてのログを保存するだけなら簡単に設定できました。FireLensからNew Relic Logsを利用する(おそらく)最も単純な方法は今回確認できました。
Fluent Bitの設定はName: newrelic
と指定し出力先をおそらく New Relicのプラグインに向けているだけであり、別途設定ファイルは必要ありませんでした。AWS for Fluent Bit の場合もすべてのログをどこか1サービス(例: CloudWatch Logs, Firehose)に送るだけならName
指定のみで済むのでやっていることは同じなのかと想像します。
New Relic以外へもログを保存したいケースもあることでしょう、カスタムログルーティングを実現する方法は追々調べて試してみようと思います。